/**
 * 日志工具类
 * 支持不同级别日志输出和级别控制
 */
const { currentDatetime } = require('./util');

class Logger {
  constructor(level = 'error') {
    // 日志级别: debug < info < warn < error
    this.level = level;
    this.levels = {
      debug: 0,
      info: 1,
      warn: 2,
      error: 3,
    };
  }

  /**
   * 设置日志级别
   * @param {string} level - 日志级别: debug, info, warn, error
   */
  setLevel(level) {
    if (this.levels[level] !== undefined) {
      this.level = level;
    } else {
      this.error(`无效的日志级别: ${level}，使用默认级别: error`);
    }
  }

  /**
   * 调试日志
   * @param {string} message - 日志消息
   * @param {object} [metadata] - 附加信息
   */
  debug(message, metadata = {}) {
    if (this.levels[this.level] <= this.levels.debug) {
      // 检查metadata是否为空对象
      if (Object.keys(metadata).length === 0) {
        console.log(`[DEBUG] ${currentDatetime()} - ${message}`);
      } else {
        console.log(`[DEBUG] ${currentDatetime()} - ${message}`, metadata);
      }
    }
  }

  /**
   * 信息日志
   * @param {string} message - 日志消息
   * @param {object} [metadata] - 附加信息
   */
  info(message, metadata = {}) {
    if (this.levels[this.level] <= this.levels.info) {
      // 检查metadata是否为空对象
      if (Object.keys(metadata).length === 0) {
        console.log(`[INFO] ${currentDatetime()} - ${message}`);
      } else {
        console.log(`[INFO] ${currentDatetime()} - ${message}`, metadata);
      }
    }
  }

  /**
   * 警告日志
   * @param {string} message - 日志消息
   * @param {object} [metadata] - 附加信息
   */
  warn(message, metadata = {}) {
    if (this.levels[this.level] <= this.levels.warn) {
      // 检查metadata是否为空对象
      if (Object.keys(metadata).length === 0) {
        console.warn(`[WARN] ${currentDatetime()} - ${message}`);
      } else {
        console.warn(`[WARN] ${currentDatetime()} - ${message}`, metadata);
      }
    }
  }

  /**
   * 错误日志
   * @param {string} message - 日志消息
   * @param {object|Error} [metadata] - 附加信息或错误对象
   */
  error(message, metadata = {}) {
    if (this.levels[this.level] <= this.levels.error) {
      // 特殊处理 Error 对象
      if (metadata instanceof Error) {
        console.error(`[ERROR] ${currentDatetime()} - ${message}`, metadata);
      } else if (Object.keys(metadata).length === 0) {
        console.error(`[ERROR] ${currentDatetime()} - ${message}`);
      } else {
        console.error(`[ERROR] ${currentDatetime()} - ${message}`, metadata);
      }
    }
  }
}

// 导出单例实例
module.exports = new Logger();
